BITS 32
%include "macrosmodoprotegido.mac"

extern reg_generales		;AGREGADO
extern reg_control			;AGREGADO
extern reg_eflags			;AGREGADO
extern reg_segmento			;AGREGADO
extern stack				;AGREGADO

%define ptr_msj	[ebp+8]
%define color 	[ebp+12]
%define fila	[ebp+16]
%define columna	[ebp+20]

global imprimir_todo
global printf

var: dd 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000

imprimir_todo:
	;macro imprimir_reg(nombre del registro,registro,fila,columna)	
	push ebp
	mov	ebp, esp
	push esi
	push edi
	push ebx
	
	; Imprimir registros generales.
	mov edi, [ebp + 32] ; Cargamos eax.
	mov esi, [reg_generales]
	imprimir_reg esi, edi, 4, 2
	
	mov edi, [ebp + 36] ; Cargamos ebx.
	mov esi, [reg_generales+4]
	imprimir_reg esi, edi, 5, 2
	
	mov edi, [ebp + 40] ; Cargamos ecx.
	mov esi, [reg_generales+8]
	imprimir_reg esi, edi, 6, 2
	
	mov edi, [ebp + 44] ; Cargamos edx.
	mov esi,[reg_generales+12]
	imprimir_reg esi, edi, 7, 2
	
	mov edi, [ebp + 48] ; Cargamos esi.
	mov esi,[reg_generales+16]
	imprimir_reg esi, edi, 8, 2
	
	mov edi, [ebp + 52] ; Cargamos edi.
	mov esi,[reg_generales+20]
	imprimir_reg esi, edi, 9, 2
	
	mov edi, [ebp + 56] ; Cargamos ebp.
	mov esi,[reg_generales+24]
	imprimir_reg esi, edi, 10, 2
	
	mov edi, [ebp + 64] ; Cargamos esp.
	mov esi,[reg_generales+28]
	imprimir_reg esi, edi, 11, 2
	
	; Imprimir registros de control.
	mov esi, [reg_control]
	imprimir_reg esi, cr0, 13, 2
	
	mov esi, [reg_control+4]
	imprimir_reg esi, cr2, 14, 2	
	
	mov esi, [reg_control+8]
	imprimir_reg esi, cr3, 15, 2	
	
	mov esi, [reg_control+12]
	imprimir_reg esi, cr4, 16, 2	
	
	; Imprimir Eflags
	mov edi, [ebp + 60]	; cargamos el eflags.
	mov esi, [reg_eflags]
	imprimir_reg esi, edi, 18, 2
	
	xor eax, eax ; Limpiamos eax.
	
	; Imprimir registros de segmento.
	mov esi, [reg_segmento]
	mov edi, [ebp + 8] ; Cargamos cs.
	imprimir_reg esi, edi, 4, 22

	mov esi, [reg_segmento+4]
	mov edi, [ebp + 12] ; Cargamos ds.
	imprimir_reg esi, edi, 5, 22
	
	mov esi, [reg_segmento+8]
	mov edi, [ebp + 16] ; Cargamos es.
	imprimir_reg esi, edi, 6, 22
	
	mov esi, [reg_segmento+12]
	mov edi, [ebp + 20] ; Cargamos fs.
	imprimir_reg esi, edi, 7, 22
	
	mov esi, [reg_segmento+16]
	mov edi, [ebp + 24] ; Cargamos gs.
	imprimir_reg esi, edi, 8, 22
	
	mov esi, [reg_segmento+20]
	mov edi, [ebp + 28] ; Cargamos ss.
	imprimir_reg esi, edi, 9, 22
	
	; Imprimir valores de la pila.
	mov eax, [stack]
	push 22
	push 11
	push 01001111b
	push eax
	call printf
	add esp, 16
	
	mov esi, [ebp + 68]
	imprimir_stack esi, 13, 22

	mov esi, [ebp + 72]
	imprimir_stack esi, 14, 22

	mov esi, [ebp + 76]
	imprimir_stack esi, 15, 22
	
	mov esi, [ebp + 80]
	imprimir_stack esi, 16, 22
	
	mov esi, [ebp + 84]
	imprimir_stack esi, 17, 22
	
	mov esi, [ebp + 88]
	imprimir_stack esi, 18, 22
	
	jmp fin

;printf(char* mensaje, unsigned int color, unsigned int fila, unsigned int columna).
printf:
	push ebp
	mov	ebp, esp
	push esi
	push edi
	push ebx
		
	; Posicionamos edi en (fila,columna).
	xor edx, edx
	xor edi, edi
	mov eax, fila
	mov ebx, 80
	mul ebx
	mov ebx, columna
	add eax, ebx
	shl eax, 1
	add edi, eax
	
	mov ah, color		; seteamos el byte de color.
	mov esi, ptr_msj	; apuntamos esi al char.
	cmp esi, 0
	je NEAR fin
	
	.ciclo:
		lodsb
		cmp al, 0
		je fin
		stosw		
		jmp .ciclo
	
fin:
	pop ebx
	pop edi
	pop esi
	pop ebp
	ret


